unit u_ConvRhema;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Gauges, StdCtrls, Buttons, Mask, ToolEdit, IBDatabase, Db,
  IBCustomDataSet, IBQuery, Grids, DBGrids;

type
  TfrmConvRhema = class(TForm)
    DB: TIBDatabase;
    tq: TIBQuery;
    IBTransaction1: TIBTransaction;
    Label2: TLabel;
    edCaminho: TFilenameEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    pb: TGauge;
    tqCODIGO: TIntegerField;
    tqFANTASIA: TIBStringField;
    tqENDERECO: TIBStringField;
    tqBAIRRO: TIBStringField;
    tqCIDADE: TIBStringField;
    tqESTADO: TIBStringField;
    tqCXPOSTAL: TIBStringField;
    tqCOMPRADOR: TIBStringField;
    tqREPRESENTANTE: TIntegerField;
    tqME: TIBStringField;
    tqSUFRAMA: TIBStringField;
    tqPAGCONTATO: TIBStringField;
    tqINSCRSUB: TIBStringField;
    tqPGTOENDERECO: TIBStringField;
    tqPGTOCID: TIBStringField;
    tqPGTOESTADO: TIBStringField;
    tqLIMITECREDITO: TFloatField;
    tqENTREGAENDERECO: TIBStringField;
    tqENTREGACIDADE: TIBStringField;
    tqENTREGAESTADO: TIBStringField;
    tqCEP: TIBStringField;
    tqPGTOCEP: TIBStringField;
    tqENTREGACEP: TIBStringField;
    tqBLOQUEIO: TIntegerField;
    tqRG_INSCREST: TIBStringField;
    tqCPF_CNPJ: TIBStringField;
    tqNOME_RAZAO: TIBStringField;
    tqTIPOPESSOA: TIBStringField;
    tqFONE: TIBStringField;
    tqFAX: TIBStringField;
    tqPAGCONTATOFONE: TIBStringField;
    tqCARTEIRA: TIntegerField;
    tqDTCADASTRO: TDateField;
    DataSource1: TDataSource;
    edCNPJ: TMaskEdit;
    edCPF: TMaskEdit;
    qr: TIBQuery;
    qrTOT: TIntegerField;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    function testa_cnpj(p_cnpj: string): Boolean;
    function testa_cpf(p_cpf: string): Boolean;
  public
    { Public declarations }
  end;

var
  frmConvRhema: TfrmConvRhema;

implementation

uses clsEntidade, clsEstado, clsCidade, clsEndereco, Biblio,
  clsTipoEndereco;

var
  Entidade: TEntidade;
  Endereco: TEndereco;
  Cidade: TCidade;
  Estado: TEstado;
  TipoEd: TTipoEndereco;

{$R *.DFM}

procedure TfrmConvRhema.BitBtn1Click(Sender: TObject);
var
  xInscE: string;
  xtp: Byte;
  xRg: string;
  xEnt,
    xCid: string;
  xGrava: Boolean;
begin
  xGrava := False;
  DB.DatabaseName := edCaminho.Text;
  DB.Connected := True;

  TipoEd.TipEnd_descricao := 'ESTABELECIMENTO';
  TipoEd.Gravar('01');
  TipoEd.TipEnd_descricao := 'COBRANCA';
  TipoEd.Gravar('02');
  TipoEd.TipEnd_descricao := 'ENTREGA';
  TipoEd.Gravar('03');

  tq.Close;
  tq.Open;

  qr.Close;
  qr.open;
  pb.MinValue := 0;
  pb.MaxValue := qrTOT.AsInteger;
  tq.First;
  while not tq.Eof do begin
    pb.Progress := pb.Progress + 1;
    if Cidade.RecuperarNome(copy(AllTrim(tqCIDADE.AsString), 1, 25)) = 0 then begin
      Cidade.Pais_Codigo := 'BR';
      Cidade.Cid_est_sigla := tqESTADO.AsString;
      Cidade.Cid_Nome := copy(AllTrim(tqCIDADE.AsString), 1, 25);
      xCid := Cidade.Recuperar_ultimo;
      Cidade.Gravar(xCid);
    end else xCid := Cidade.Cod_Cid;

    edCNPJ.Text := tira_PT(tqCPF_CNPJ.AsString);
    if testa_cnpj(edCNPJ.Text) then begin
      Entidade.Ent_Cnpj := tira_PT(tqCPF_CNPJ.AsString);
      xtp := 1;
    end;

    Entidade.Rep_Codigo := '';
    Entidade.Ent_Nome := copy(tqNOME_RAZAO.AsString, 1, 40);
    Entidade.Ent_Fantasia := copy(tqFANTASIA.AsString, 1, 25);

    xInscE := '';
    if Valida_InscricaoE(tqRG_INSCREST.AsString, tqESTADO.AsString, xInscE) then
      Entidade.Ent_Inscest := xInscE
    else begin
      if Length(tqRG_INSCREST.AsString) <= 11 then
        xRg := tqRG_INSCREST.AsString;
    end;

    Entidade.Ent_Datacad := tqDTCADASTRO.AsDateTime;
    Entidade.Ent_Dataina := 0;
    Entidade.Ent_Limite := tqLIMITECREDITO.AsFloat;
    Entidade.Ent_Observacao := '';

    if tqBLOQUEIO.AsString = '1' then
      Entidade.Ent_Bloqueado := 'S'
    else
      Entidade.Ent_Bloqueado := 'N';

    edCPF.Text := tira_PT(tqCPF_CNPJ.AsString);
    if testa_cpf(edCPF.Text) then begin
      Entidade.Ent_Cpf := tira_PT(tqCPF_CNPJ.AsString);
      xtp := 0;
    end;

    Entidade.Ent_TipoEnt := 0;
    Entidade.Ent_Rg := xRg;

    try
      XEnt := StrZero(Entidade.Ultimo(2), 5);
      //if (Entidade.Recuperar_nome2(tqNOME_RAZAO.AsString) = 0) or (entidade.Recuperar_cnpj(tira_PT(tqCPF_CNPJ.AsString)) = 0) then begin
      Entidade.Gravar(xEnt);
      xGrava := True;
      //end else begin
      // xGrava:= False;
      //end;
    except
    end;

    //Endereco do Estabelecimento
    Endereco.Cid_Codigo := xCid;
    Endereco.End_Endereco := copy(tqENDERECO.AsString, 1, 40);
    Endereco.End_bairro := copy(tqBAIRRO.AsString, 1, 25);
    Endereco.End_Cep := tira_PT(tqCEP.AsString);
    Endereco.End_Fone := tqFONE.AsString;
    Endereco.End_Fax := tqFAX.AsString;
    try
      if xGrava then
        Endereco.Gravar(xEnt, '01', Endereco.Ultimo(xEnt, '01'));
    except
    end;

    //Endereco de Cobranca
    if Cidade.RecuperarNome(copy(AllTrim(tqPGTOCID.AsString), 1, 25)) = 0 then begin
      Cidade.Pais_Codigo := 'BR';
      Cidade.Cid_est_sigla := tqPGTOESTADO.AsString;
      Cidade.Cid_Nome := copy(AllTrim(tqPGTOCID.AsString), 1, 25);
      xCid := Cidade.Recuperar_ultimo;
      Cidade.Gravar(xCid);
    end else xCid := Cidade.Cod_Cid;

    Endereco.Cid_Codigo := xCid;
    Endereco.End_Endereco := copy(tqPGTOENDERECO.AsString, 1, 40);
    try
      if xGrava then
        Endereco.Gravar(xEnt, '02', Endereco.Ultimo(xEnt, '01'));
    except
    end;

    //Endereco de Entrega
    if Cidade.RecuperarNome(copy(AllTrim(tqENTREGACIDADE.AsString), 1, 25)) = 0 then begin
      Cidade.Pais_Codigo := 'BR';
      Cidade.Cid_est_sigla := tqENTREGAESTADO.AsString;
      Cidade.Cid_Nome := copy(AllTrim(tqENTREGACIDADE.AsString), 1, 25);
      xCid := Cidade.Recuperar_ultimo;
      Cidade.Gravar(xCid);
    end else xCid := Cidade.Cod_Cid;

    Endereco.Cid_Codigo := xCid;
    Endereco.End_Endereco := copy(tqENTREGAENDERECO.AsString, 1, 40);
    Endereco.End_Cep := tira_PT(tqENTREGACEP.AsString);
    try
      if xGrava then
        Endereco.Gravar(xEnt, '03', Endereco.Ultimo(xEnt, '01'));
    except
    end;

    tq.Next;
  end;
  tq.Close;
  ShowMessage('Dados convertidos com sucesso');
end;

procedure TfrmConvRhema.FormCreate(Sender: TObject);
begin
  DB.Connected := False;

  Entidade := TEntidade.Create;
  Endereco := TEndereco.Create;
  Cidade := TCidade.Create;
  Estado := TEstado.Create;
  TipoEd := TTipoEndereco.Create;
end;

procedure TfrmConvRhema.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Entidade.Free;
  Endereco.Free;
  Cidade.Free;
  Estado.Free;
  TipoEd.Free;
end;

function TfrmConvRhema.testa_cnpj(p_cnpj: string): Boolean;
var
  l_dig1, l_dig2, l_dig3, l_dig4: Integer;
  l_dig: array[1..14] of Integer;
  i: Integer;
  l_ret: Boolean;

begin
  p_cnpj := alltrim(p_cnpj);
  if length(p_cnpj) = 14 then begin
    for i := 1 to 14 do begin
      l_dig[i] := StrToInt(copy(p_cnpj, i, 1));
    end;
    l_dig1 := (l_dig[01] * 5) + (l_dig[02] * 4) + (l_dig[03] * 3) + (l_dig[04] * 2) +
      (l_dig[05] * 9) + (l_dig[06] * 8) + (l_dig[07] * 7) + (l_dig[08] * 6) +
      (l_dig[09] * 5) + (l_dig[10] * 4) + (l_dig[11] * 3) + (l_dig[12] * 2);
    l_dig2 := 11 - (l_dig1 - (l_dig1 div 11) * 11);
    if (l_dig2 = 10) or (l_dig2 = 11) then begin
      l_dig2 := 0;
    end;
    l_dig3 := (l_dig[01] * 6) + (l_dig[02] * 5) + (l_dig[03] * 4) + (l_dig[04] * 3) +
      (l_dig[05] * 2) + (l_dig[06] * 9) + (l_dig[07] * 8) + (l_dig[08] * 7) +
      (l_dig[09] * 6) + (l_dig[10] * 5) + (l_dig[11] * 4) + (l_dig[12] * 3) + (l_dig2 * 2);
    l_dig4 := 11 - (l_dig3 - (l_dig3 div 11) * 11);
    if (l_dig4 = 10) or (l_dig4 = 11) then begin
      l_dig4 := 0;
    end;
    if (l_dig[13] <> l_dig2) or (l_dig[14] <> l_dig4) then begin
      l_ret := false;
    end else begin
      l_ret := true;
    end;
  end else begin
    l_ret := False;
  end;
  Result := l_ret;

end;

function TfrmConvRhema.testa_cpf(p_cpf: string): Boolean;
var
  l_d1, l_d2, l_pr2, l_pr3: Integer;
  l_dig: array[1..14] of Integer;
  i: Integer;
  l_ret: Boolean;

begin
  p_cpf := alltrim(p_cpf);
  if length(p_cpf) = 11 then begin
    for i := 1 to 11 do begin
      l_dig[i] := StrToInt(copy(p_cpf, i, 1))
    end;
    l_d1 := (l_dig[1] * 10) + (l_dig[2] * 9) + (l_dig[3] * 8) + (l_dig[4] * 7) + (l_dig[5] * 6) +
      (l_dig[6] * 5) + (l_dig[7] * 4) + (l_dig[8] * 3) + (l_dig[9] * 2);
    l_pr2 := 11 - (l_d1 mod 11);
    if (l_pr2 = 10) or (l_pr2 = 11) then begin
      l_pr2 := 0;
    end;
    l_d2 := (l_dig[9] * 3) + (l_dig[8] * 4) + (l_dig[7] * 5) + (l_dig[6] * 6) + (l_dig[5] * 7) +
      (l_dig[4] * 8) + (l_dig[3] * 9) + (l_dig[2] * 10) + (l_dig[1] * 11) + (l_pr2 * 2);
    l_pr3 := 11 - (l_d2 mod 11);
    if (l_pr3 = 10) or (l_pr3 = 11) then begin
      l_pr3 := 0;
    end;
    if (l_pr3 <> l_dig[11]) or (l_pr2 <> l_dig[10]) then begin
      l_ret := False;
    end else begin
      l_ret := True;
    end;
  end else begin
    l_ret := False;
  end;
  Result := l_ret;

end;

end.
